package com.srv.servlet;

import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import com.srv.control.HashControl;
import com.srv.dao.DAOCidade;
import com.srv.dao.DAOGradeHoraria;
import com.srv.dao.DAOReserva;
import com.srv.dao.DAOVeiculo;
import com.srv.pojo.Cidade;
import com.srv.pojo.GradeHoraria;
import com.srv.pojo.Reserva;
import com.srv.pojo.Usuario;
import com.srv.pojo.Veiculo;

/**
 * Servlet implementation class EfetuarReservaServlet
 */
@WebServlet("/EfetuarReservaServlet")
public class EfetuarReservaServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

	/**
	 * @see HttpServlet#HttpServlet()
	 */
	public EfetuarReservaServlet() {
		super();
		// TODO Auto-generated constructor stub
	}

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse
	 *      response)
	 */
	protected void doGet(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {
		String strVecode = request.getParameter("vecode");

		int vecode = Integer.parseInt(strVecode.trim());

		HttpSession session = request.getSession(false);

		try {
			session.setAttribute("reserva", null);
			
			if (session.getAttribute("email") != null) {
				String rs = session.getAttribute("email").toString() + "S.R.V";
				rs = HashControl.md5(rs);

				if (!session.getAttribute("controle").toString().equals(rs)) {
					request.setAttribute("msg",
							"É necessário fazer o login para efetuar a reserva!");
					RequestDispatcher view = request
							.getRequestDispatcher("index.jsp");
					view.forward(request, response);
				} else {
					DAOVeiculo daoVeiculo = new DAOVeiculo();
					Veiculo veiculo = daoVeiculo.getVeiculoByVecode(vecode);
					session.setAttribute("veiculo", veiculo);
					
					DAOGradeHoraria daoGradeHoraria = new DAOGradeHoraria();
					List<GradeHoraria> horarios = daoGradeHoraria.getGradeHorariaList();
					session.setAttribute("horarios", horarios);
					
					DAOCidade daoCidade = new DAOCidade();
					List<Cidade> cidades = daoCidade.getCidadeList();
					session.setAttribute("cidades", cidades);

					request.getRequestDispatcher("efetuarReserva.jsp").forward(
							request, response);
				}
			} else {
				RequestDispatcher view = request
						.getRequestDispatcher("index.jsp");
				view.forward(request, response);
			}
		} catch (Exception e) {
			session.invalidate();
			request.setAttribute("msg", "Ocorreu um erro." + e.getMessage());
			e.printStackTrace();
			RequestDispatcher view = request.getRequestDispatcher("index.jsp");
			view.forward(request, response);
		}
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse
	 *      response)
	 */
	protected void doPost(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {
		try {
			HttpSession session = request.getSession();
			
			DAOReserva daoReserva = new DAOReserva();
				Date dataPartida = (Date) new SimpleDateFormat("dd/MM/yyyy").parse(request.getParameter("dataPartida"));
				Date dataRetorno = null;
				if (!request.getParameter("dataRetorno").equals("")){
					dataRetorno = (Date) new SimpleDateFormat("dd/MM/yyyy").parse(request.getParameter("dataRetorno"));
				}
				
				GradeHoraria ghPartida = new GradeHoraria();
				ghPartida.setGhcode(Integer.parseInt(request.getParameter("horaPartida")));
				
				GradeHoraria ghRetorno = null;
				if (!request.getParameter("horaRetorno").equals("")) {
					ghRetorno = new GradeHoraria();
					ghRetorno.setGhcode(Integer.parseInt(request.getParameter("horaRetorno")));
				}
				
				Cidade cidadeOrigem = new Cidade();
				cidadeOrigem.setCicode(Integer.parseInt(request.getParameter("cidadeOrigem")));
				
				Cidade cidadeDestino = new Cidade();
				cidadeDestino.setCicode(Integer.parseInt(request.getParameter("cidadeDestino")));
				
				Veiculo veiculo = (Veiculo)session.getAttribute("veiculo");
				
				List<Reserva> reservas = daoReserva.getReservaList(dataPartida, ghPartida, veiculo, cidadeOrigem, cidadeDestino);
				session.setAttribute("auxReservas", reservas);
				
				//Retirando objetos não mais usados pela sessão
				session.removeAttribute("cidades");
				session.removeAttribute("horarios");
				
				Usuario usuario = new Usuario();
				
				// TODO : Melhorar tratamento para assegurar que este usuário seja verdadeiro
				usuario.setEmail((String)session.getAttribute("email"));

				Reserva reserva = new Reserva();
				String strOperacao = "";
				if("alterar".equals(request.getParameter("tipo_operacao")) ){ 
					strOperacao = "?tipo_operacao=alterar";
					reserva = (Reserva)session.getAttribute("reserva");
				}
				
				reserva.setUsuario(usuario);
				reserva.setVeiculo(veiculo);
				reserva.setCidadeOrigem(cidadeOrigem);
				reserva.setCidadeDestino(cidadeDestino);
				reserva.setHoraPartida(ghPartida);
				reserva.setHoraRetorno(ghRetorno);
				reserva.setDataPartida(dataPartida);
				reserva.setDataRetorno(dataRetorno);
			
				session.setAttribute("reserva", reserva);			
			
			RequestDispatcher view = request
					.getRequestDispatcher("selecionaPoltrona.jsp"+strOperacao);
			view.forward(request, response);
			
		} catch (Exception ex) {
			System.out.println("Ocorreu um erro " + ex.getMessage());
		}

	}

}
